package inteligencia_personaje;


import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JOptionPane;

import entidades.PowerUp;

import recursos.Coordenada;
import roles.Malo;
import roles.Mario;

import TDADiccionario.Entry;
import TDAListaSE.Iterator;
import TDAListaSE.NoSuchElementException;

import main.Programa;
import graficos.RepresentacionGrafica;
import inteligencia_mapa.MoverEnAire;
import inteligencia_mapa.MovimientoMapa;

public class ControlDeJuego extends Thread{
	
	protected Programa elPrograma;
	protected MoverEnAire movAire;
	protected MovimientoMapa movMapa;
	
	
	public ControlDeJuego(MovimientoMapa movMapa, MoverEnAire movAire, Programa elPrograma){
		this.movMapa = movMapa;
		this.movAire = movAire;
		this.elPrograma = elPrograma;
	}
	
	public void controlarMalosYMario(){
		Iterator<Entry<Integer,Malo>> it = elPrograma.obtenerMalos();
		while(it.hasNext()){
			try {
				Entry<Integer,Malo> eaux = it.next();
				Malo aux = eaux.getValue();
				int coordXmalo = aux.obtenerCoordenada().obtenerX();
				int coordYmalo = aux.obtenerCoordenada().obtenerY();
				if(aux.obtenerCoordenada().obtenerY() >= 448){
					movMapa.obtenerContainer().remove(aux.obtenerRepresentacionGrafica());
					elPrograma.eliminarMalo(eaux);
					aux.morirse();
				}
				Mario mAux = elPrograma.obtenerMario();
				int coordXmario = mAux.obtenerCoordenada().obtenerX();
				int coordYmario = mAux.obtenerCoordenada().obtenerY();
				boolean chocaXArriba = coordYmario + 32 == coordYmalo && coordXmario<coordXmalo+32 && coordXmario>coordXmalo-32;
				boolean chocaXDerecha = coordXmario + 32 == coordXmalo && coordYmario<coordYmalo+32 && coordYmario>coordYmalo-32;
				boolean chocaXIzquierda = coordXmario - 32 == coordXmalo && coordYmario<coordYmalo+32 && coordYmario>coordYmalo-32;
				boolean chocaXAbajo = coordYmario - 32 == coordYmalo && coordXmario<coordXmalo+32 && coordXmario>coordXmalo-32;
				if(chocaXArriba){
					boolean kog = aux.matar();
					if(!kog){	
						movMapa.obtenerContainer().remove(aux.obtenerRepresentacionGrafica());
						elPrograma.eliminarMalo(eaux);	
					}else{
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						movMapa.obtenerContainer().remove(aux.obtenerRepresentacionGrafica());
						elPrograma.eliminarMalo(eaux);
					}
				}else
					if(!elPrograma.obtenerMario().getinvensible()){
						if((chocaXDerecha || chocaXIzquierda || chocaXAbajo)){
							aux.matarMario();
							terminars();
							this.stop();
						}
					}
				//movMapa.refreshMapa(0);
			}catch (NoSuchElementException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public void ControlarPowersYMario(){
		Iterator<Entry<Integer,PowerUp>> it = elPrograma.obtenerPowers();
		while(it.hasNext()){
			try {
				Entry<Integer,PowerUp> eaux = it.next();
				PowerUp aux = eaux.getValue();
				if(aux.obtenermostrar()){
				int coordXPU = aux.obtenerCoordenada().obtenerX();
				int coordYPU = aux.obtenerCoordenada().obtenerY();
				Mario mAux = elPrograma.obtenerMario();
				int coordXmario = mAux.obtenerCoordenada().obtenerX();
				int coordYmario = mAux.obtenerCoordenada().obtenerY();
				boolean chocaXArriba = coordYmario + 32 == coordYPU && coordXmario<coordXPU+32 && coordXmario>coordXPU-32;
				boolean chocaXDerecha = coordXmario + 32 == coordXPU && coordYmario<coordYPU+32 && coordYmario>coordYPU-32;
				boolean chocaXIzquierda = coordXmario - 32 == coordXPU && coordYmario<coordYPU+32 && coordYmario>coordYPU-32;
				//boolean chocaXAbajo = coordYmario - 32 == coordYPU && coordXmario<coordXPU+32 && coordXmario>coordXPU-32;
			//	System.out.println(chocaXDerecha || chocaXIzquierda)
				if(chocaXArriba||chocaXDerecha || chocaXIzquierda /*0|| chocaXAbajo**/){
					aux.activar(eaux );
					}}
			}catch (NoSuchElementException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	
	
	
	public void terminar(){
		JOptionPane.showMessageDialog(null, "PERDISTE  Puntaje: "+elPrograma.obtenerPuntaje(), "Juego Finalizado", JOptionPane.INFORMATION_MESSAGE);
		movMapa.stop();
		movAire.stop();
		movMapa.obtenerContainer().setVisible(false);
		
	}
	public void terminars(){
		if(elPrograma.obtenervidas()==1){
		movMapa.stop();
		movAire.stop();
		movMapa.obtenerContainer().setVisible(false);
		JOptionPane.showMessageDialog(null, "PERDISTE  Puntaje: "+elPrograma.obtenerPuntaje(), "Juego Finalizado", JOptionPane.INFORMATION_MESSAGE);
		}else{
			elPrograma.decrementarvida();
			
		}
	}
	public void terminarY(){
		if(elPrograma.obtenervidas()==1){
		movMapa.stop();
		movAire.stop();
		movMapa.obtenerContainer().setVisible(false);
		JOptionPane.showMessageDialog(null, "PERDISTE  Puntaje: "+elPrograma.obtenerPuntaje(), "Juego Finalizado", JOptionPane.INFORMATION_MESSAGE);
		}else{
			elPrograma.decrementarvida();
			elPrograma.obtenerMario().establecerCoordenada(elPrograma.obtenerMario().obtenerCoordenada().obtenerX()+96, 352);
			elPrograma.establecerActualX(elPrograma.obtenerActualX()+96);
			elPrograma.obtenerMovMapa().refreshMapa(elPrograma.obtenerActualX());
			
			
		}
	}
	
	
	public void run(){
		while(true){
			try{
				controlarMalosYMario();
				ControlarPowersYMario();
				if(elPrograma.obtenerMario().obtenerCoordenada().obtenerY() >= 448 ){
					elPrograma.incrementarPuntaje(15);
					terminarY();
					
					this.stop();
				}
				if(elPrograma.obtenerMario().obtenerCoordenada().obtenerX() >= 5192){
					terminar();
					JOptionPane.showMessageDialog(null, "GANASTE  Puntaje: "+elPrograma.obtenerPuntaje(), "Juego Finalizado", JOptionPane.INFORMATION_MESSAGE);
					this.stop();
					
				}
				
			}catch(Exception e){
			}
		}
	}

}
